<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8"/>
    <link rel="apple-touch-icon" sizes="76x76" href="./assets/img/favicon.ico">
    <link rel="icon" type="image/png" href="./assets/img/favicon.ico">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <title>Anchor Bootstrap 4.1.3 UI Kit by WowThemesNet</title>
    <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport'/>

    <!-- Google Font -->
    <link href="https://fonts.googleapis.com/css?family=Nunito:300,300i,400,600,800" rel="stylesheet">

    <!-- Font Awesome Icons -->
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU" crossorigin="anonymous">

    <!-- Main CSS -->
    <link href="./assets/css/main.css" rel="stylesheet"/>

    <!-- Animation CSS -->
    <link href="./assets/css/vendor/aos.css" rel="stylesheet"/>

</head>

<body>

<!------------------------------------------
NAVBAR:不用改
------------------------------------------->

<!------------------------------------------
HEADER
------------------------------------------->
<div class="jumbotron jumbotron-lg jumbotron-fluid mb-3 bg-primary position-relative">
    <div class="container text-white h-100 tofront">
        <div class="row align-items-center justify-content-center text-center">
            <div class="col-md-10">
                <!-- thymeleaf语法:渲染文章题目 -->
                <h1>Hystrix 简单聊聊断路器/熔断器</h1>
            </div>
        </div>
    </div>
</div>



<div class="container  pt-5 pb-5" data-aos="fade-up">
    <div class="row justify-content-center">
        <div class="col-md-8 mt-20">
            <article>
                <!-- 此处渲染标题 -->
                <h1><strong>Bold title</strong> for your paragraph</h1>
<!--                <p th:text="${article.content}">Welcome to BeiJing!</p>-->
                <tbody>
                    <td><h3 id="toc_0" style="font-size: 16px; font-weight: bold; line-height: 1.5; margin-top: 10px; margin-right: 0px; margin-left: 0px; color: rgb(0, 0, 0); font-family: 微软雅黑, 宋体, Arial;">什么是Hystrix</h3><p style="margin-top: 10px; margin-right: auto; margin-left: auto; line-height: 24px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;">Hystrix 在SpringCloud中负责服务熔断服务降级的作用。<br>Hystrix 存在的目的也是为了防止过多超时导致系统瘫痪。比如多个服务之间的相互调用，如下图：<br><img src="https://lee-blog.oss-cn-shanghai.aliyuncs.com/2020/03/16/15825246907695.jpg" alt="-w757" style="height: auto; max-width: 100%; margin: 10px;"></p><blockquote style="background-image: none; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-color: rgb(239, 239, 239); border-image: initial; padding: 5px 10px; margin-top: 10px; margin-bottom: 10px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;"><p style="margin: 10px auto; line-height: 24px;">订单-&gt;商品-&gt;积分-&gt;日志<br>订单-&gt;支付-&gt;日志<br>商品-&gt;风控-&gt;日志<br>服务之间相互调用，假设某个链路上的某个服务比如日志服务超时了，不可被调用，那么其他的服务全部卡死，导致崩溃。</p></blockquote><p style="margin-top: 10px; margin-right: auto; margin-left: auto; line-height: 24px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;">举一个生活中的例子：<br><img src="https://lee-blog.oss-cn-shanghai.aliyuncs.com/2020/03/16/15825253794270.jpg" alt="-w767" style="height: auto; max-width: 100%; margin: 10px;"><br>在家里，我开了很多电器，这个时候如果没有一个保护装置的话，由于某个电器过载，最终会导致整个电路断掉，那么每户人家肯定会有一个装置叫做<code>保险丝</code>，那么Hystrix断路器就起到了保险丝的作用，他可以保护整个系统。<br>Hystrix在分布式系统或者微服务中，一旦出现了超时或者依赖服务不可用调用失败异常等情况，他能够保证整个系统不会整体宕机崩溃，从而提高整个系统的健壮性。</p><p style="margin-top: 10px; margin-right: auto; margin-left: auto; line-height: 24px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;">Hystrix的原理就是当某一个服务发生故障的时候，这个时候是不会有任何的正常响应的，但是通过Hystrix可以返回一个备用响应，也就是所谓的backup，如此一来，发生异常的系统就不会造成不必要的超时等异常现象，这就好比打篮球，上场必须要5人，但是如果有人受伤要下场，这个时候就必须要有backup球员，如果没有，这个球队很难进行比赛了。</p><blockquote style="background-image: none; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-color: rgb(239, 239, 239); border-image: initial; padding: 5px 10px; margin-top: 10px; margin-bottom: 10px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;"><p style="margin: 10px auto; line-height: 24px;">简单一句话总结，就是Hystrix可以保证在众多微服务中一个服务出现了问题不会引发整体系统奔溃的一个开源组件。</p></blockquote><h3 id="toc_1" style="font-size: 16px; font-weight: bold; line-height: 1.5; margin-top: 10px; margin-right: 0px; margin-left: 0px; color: rgb(0, 0, 0); font-family: 微软雅黑, 宋体, Arial;">服务熔断</h3><p style="margin-top: 10px; margin-right: auto; margin-left: auto; line-height: 24px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;">熔断是一种微服务链路的保护机制，当某个服务（依赖）不可用/宕机/超时/异常的时候，会进行服务的熔断（是一个开关，会开启），这个发生故障的节点就被<code>熔断了</code>也就是不可用，不会再让用户调用到，那么此时就需要降级，来直接会返回一个错误的异常响应信息。当这个节点OK恢复了，hystrix会检测到，然后再把他恢复到整个链路。</p><blockquote style="background-image: none; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-color: rgb(239, 239, 239); border-image: initial; padding: 5px 10px; margin-top: 10px; margin-bottom: 10px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;"><p style="margin: 10px auto; line-height: 24px;">熔断机制在很多行业里都有，比如股市，金融行业，都是为了更好更有效的控制，把损失控制在一定的范围内。</p></blockquote><h3 id="toc_2" style="font-size: 16px; font-weight: bold; line-height: 1.5; margin-top: 10px; margin-right: 0px; margin-left: 0px; color: rgb(0, 0, 0); font-family: 微软雅黑, 宋体, Arial;">代码演示</h3><ul style="list-style: none; margin-right: 0px; margin-bottom: 0px; margin-left: 30px; padding: 0px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;"><li style="list-style-type: disc;">pom 中加入依赖</li></ul><pre style="margin-bottom: 0px; white-space: pre-wrap; color: rgb(0, 0, 0); font-size: 15px; background-color: rgb(255, 255, 255);"><code class="hljs xml">
</code></pre><ul style="list-style: none; margin-right: 0px; margin-bottom: 0px; margin-left: 30px; padding: 0px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;"><li style="list-style-type: disc;">启动类开启熔断器</li></ul><pre style="margin-bottom: 0px; white-space: pre-wrap; color: rgb(0, 0, 0); font-size: 15px; background-color: rgb(255, 255, 255);"><code class="hljs less"><span class="hljs-variable" style="color: rgb(0, 128, 0);">@EnableCircuitBreaker</span>
</code></pre><ul style="list-style: none; margin-right: 0px; margin-bottom: 0px; margin-left: 30px; padding: 0px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;"><li style="list-style-type: disc;">编写错误的controller</li></ul><ul style="list-style: none; margin-right: 0px; margin-bottom: 0px; margin-left: 30px; padding: 0px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;"><li style="list-style-type: disc;"><p style="margin-top: 10px; margin-right: auto; margin-left: auto; line-height: 24px;">测试：</p><ol style="padding-left: 40px;"><li style="list-style-type: disc;">如果正常访问，显示&nbsp;<code>Hello hystrix~</code></li><li style="list-style-type: disc;"><p style="margin-top: 10px; margin-right: auto; margin-left: auto; line-height: 24px;">发生异常熔断，则展示：</p><p style="margin-top: 10px; margin-right: auto; margin-left: auto; line-height: 24px;"><img src="https://lee-blog.oss-cn-shanghai.aliyuncs.com/2020/03/16/15825390038380.jpg" alt="-w416" style="height: auto; max-width: 100%; margin: 10px;"></p></li></ol></li></ul><h3 id="toc_3" style="font-size: 16px; font-weight: bold; line-height: 1.5; margin-top: 10px; margin-right: 0px; margin-left: 0px; color: rgb(0, 0, 0); font-family: 微软雅黑, 宋体, Arial;">服务器降级</h3><p style="margin-top: 10px; margin-right: auto; margin-left: auto; line-height: 24px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;">当某个服务资源不够的时候，可以启用降级处理。</p><p style="margin-top: 10px; margin-right: auto; margin-left: auto; line-height: 24px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;">举一个例子，如下图：<br><img src="https://lee-blog.oss-cn-shanghai.aliyuncs.com/2020/03/16/15827022515247.jpg" alt="-w724" style="height: auto; max-width: 100%; margin: 10px;"><br>假设我们家里用很多电器，其他电器正在使用中并且占用的电流啊电压啥的很大，空调我这个时候可以不用，把资源给到其他的电器，这时我们是直接把空调插头拔出，区别于熔断，熔断的话是发生异常后和谐的响应信息，而降级是我把这个服务关停了，随后在响应给用户。需要注意，由于服务关闭了，所以响应是发生在调用方的，也就是客户端，比如图中的<code>电热水壶</code>和<code>微波炉</code>。当电压电流恢复后，我们再把空调插头插上即可，那么这就是降级的一种方式。</p><p style="margin-top: 10px; margin-right: auto; margin-left: auto; line-height: 24px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;">那么熔断和降级的异同点是啥呢？</p><ul style="list-style: none; margin-right: 0px; margin-bottom: 0px; margin-left: 30px; padding: 0px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;"><li style="list-style-type: disc;">相同点：<ul style="list-style: none; margin-right: 0px; margin-left: 30px; padding: 0px;"><li style="list-style-type: circle;">都是为了提升系统的可靠性</li><li style="list-style-type: circle;">都为了正确的返回响应给用户</li></ul></li><li style="list-style-type: disc;">不同点：<ul style="list-style: none; margin-right: 0px; margin-left: 30px; padding: 0px;"><li style="list-style-type: circle;">熔断：被调用的服务方（下游）发生故障导致</li><li style="list-style-type: circle;">降级：全局整体服务负载过高，有效调动资源服务，由调用方（上游）控制</li></ul></li></ul><h3 id="toc_4" style="font-size: 16px; font-weight: bold; line-height: 1.5; margin-top: 10px; margin-right: 0px; margin-left: 0px; color: rgb(0, 0, 0); font-family: 微软雅黑, 宋体, Arial;">熔断解耦分离</h3><p style="margin-top: 10px; margin-right: auto; margin-left: auto; line-height: 24px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;">当使用<code>@HystrixCommand</code>的时候，每有一个controller的接口api，就会有一个熔断方法，这是成倍的增长的，数量会很多，维护不方便，所以需要解耦开来。而且，当我们关闭不用的微服务时，上游还是会调用下游，所以我们需要在上游服务这块，去增加降级的方法，如果服务无法调用，则调用上游服务中的降级方法即可。并且下游服务如果被我们关闭，上游的调用还是可以有响应给用户的。</p><h3 id="toc_5" style="font-size: 16px; font-weight: bold; line-height: 1.5; margin-top: 10px; margin-right: 0px; margin-left: 0px; color: rgb(0, 0, 0); font-family: 微软雅黑, 宋体, Arial;">简单总结一下</h3><p style="margin-top: 10px; margin-right: auto; margin-left: auto; line-height: 24px; font-family: 微软雅黑, 宋体, Arial; font-size: 15px;">熔断：当一个服务发生故障异常，这个时候熔断当前整个服务，把这个服务变的不可被访问，而不是客户端请求这个服务的时候一直处于超时。<br>降级：当服务熔断后，我们需要提供新的一个兜底接口返回响应数据，如此一来，客户端能够友好的接受到响应消息。</p></td>
                </tbody>
            </article>
        </div>
    </div>
</div>
<!-- End Main -->
<!--------------------------------------
JAVASCRIPTS:不用改
--------------------------------------->
<!-- CDN 引入vue 和 axios -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="./assets/js/vendor/jquery.min.js" type="text/javascript"></script>
<script src="./assets/js/vendor/popper.min.js" type="text/javascript"></script>
<script src="./assets/js/vendor/bootstrap.min.js" type="text/javascript"></script>
<script src="./assets/js/functions.js" type="text/javascript"></script>

<!-- Animation -->
<script src="./assets/js/vendor/aos.js" type="text/javascript"></script>
<noscript>
    <style>
        *[data-aos] {
            display: block !important;
            opacity: 1 !important;
            visibility: visible !important;
        }
    </style>
</noscript>
<script>
    AOS.init({
        duration: 700
    });
</script>

<script type="module">
    import { onMounted, ref } from 'vue'
    import request from '@/utils/request.js'
    defineProps({
        data: {
            type: Array,
            required: true
        }
    })
    //获取数据
    const blogs = ref([])
    const getData = async () => {
        let res = await request({
            url: '/article/2/1',
            method: 'GET'
            //data: { content: '好' }
        })
        console.log('res:', res)
        blogs.value = res.rows
        console.log('blogs', blogs)
    }

    onMounted(() => {
        getData(),
            console.log("'blogs', blogs")
    })
</script>

<!-- Disable animation on less than 1200px, change value if you like -->
<script>
    AOS.init({
        disable: function () {
            var maxWidth = 1200;
            return window.innerWidth < maxWidth;
        }
    });
    // $(document).ready(function () {
    //
    //     if(location.href.indexOf("#reloaded")==-1){
    //         location.href=location.href+"#reloaded";
    //         location.reload();
    //     }
    // })
    if (location.href.indexOf("#reloaded") == -1) {
        location.href = location.href + "#reloaded";
        location.reload();
    };
</script>

</body>
</html>